package com.example.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 跨域问题第三种解决方式
 */

/**
 * 关键：让 Spring Boot 自动加载这个 Filter
 * 只要你加了 @Component 注解，Spring Boot 会自动注册这个 Filter，不需要额外配置。
 * 如果你不使用 @Component，也可以手动注册
 */
//@Component
public class CorsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        /**
         * servletRequest 和 servletResponse 是最基本的 Servlet 接口类型。
         * 通常我们实际处理的是 HTTP 请求，因此会进行强制类型转换
         * 用原始的 ServletRequest，是访问不到这些 HTTP 方法的
         */
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        /**
         * 设置 CORS 相关的响应头
         */
        // 允许访问的前端域名（不能和 credentials=true 一起用 *）
        response.setHeader("Access-Control-Allow-Origin", "*");
        // 允许的请求方法（如 GET、POST）
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        // 允许前端发送的自定义请求头
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Authorization");
        // 是否允许携带 Cookie 等身份凭证
        response.setHeader("Access-Control-Allow-Credentials", "false");
        // 浏览器对预检请求结果的缓存时间（秒）
        response.setHeader("Access-Control-Max-Age", "3600");
        /**
         * 放行其他请求
         * 那 chain.doFilter 用哪个对象比较好？
         * ✅ 正确做法是：用你实际处理过的对象，即 request 和 response
         * 如果你在 Filter 中对 request 或 response 做了修改、包装，必须传入这些“新对象”。
         * 如果你只是把 servletRequest 强转了一下没做修改，那 chain.doFilter(servletRequest, servletResponse) 也是可以的。
         * 但为了统一逻辑、避免出错，推荐始终用你转换之后的 request、response 进行传递。
         */
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
